package graph.day11;

import java.util.*;

public class Kama_117 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        // 记录入度
        int[] inDegree = new int[n];
        // 记录文件依赖关系
        List<List<Integer>> dependRelation = new ArrayList<>();

        for (int i = 0; i < n; i++) {
            dependRelation.add(new ArrayList<>());
        }

        for (int i = 0; i < m; i++) {
            int s = sc.nextInt();
            int t = sc.nextInt();
            inDegree[t]++;
            // 记录s指向哪些文件，即是哪些文件的前置文件
            dependRelation.get(s).add(t);
        }

        Queue<Integer> queue = new LinkedList<>();
        for (int i = 0; i < n; i++) {
            if (inDegree[i] == 0) {
                // 入度为0的文件，可以作为开头，先加入队列
                queue.add(i);
            }
        }

        List<Integer> result = new ArrayList<>();

        // 拓扑排序
        while (!queue.isEmpty()) {
            int cur = queue.poll(); // 当前选中的文件
            result.add(cur);
            for (int file : dependRelation.get(cur)) {
                inDegree[file]--; // cur的指向的文件入度-1
                if (inDegree[file] == 0) {
                    queue.add(file);
                }
            }
        }

        // 如果结果集包含的元素个数等于n，说明能成功处理，不然说明存在循环依赖，无法成功处理
        if (result.size() == n) {
            for (int i = 0; i < result.size(); i++) {
                System.out.print(result.get(i));
                if (i < result.size() - 1) {
                    System.out.print(" ");
                }
            }
        } else {
            System.out.println(-1);
        }

    }
}
